/**
 * 零售中台系统通用测试脚本
 * 包含常用的测试函数和工具方法
 */

// 通用响应验证函数
function validateCommonResponse(response) {
    pm.test("状态码为200", function () {
        pm.response.to.have.status(200);
    });

    pm.test("响应时间小于5秒", function () {
        pm.expect(pm.response.responseTime).to.be.below(5000);
    });

    pm.test("响应内容类型为JSON", function () {
        pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');
    });

    pm.test("响应包含code字段", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData).to.have.property('code');
    });

    pm.test("响应包含message字段", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData).to.have.property('message');
    });
}

// 分页响应验证函数
function validatePageResponse(response) {
    validateCommonResponse(response);
    
    pm.test("响应包含分页信息", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData).to.have.property('data');
        pm.expect(jsonData.data).to.have.property('records');
        pm.expect(jsonData.data).to.have.property('total');
        pm.expect(jsonData.data).to.have.property('current');
        pm.expect(jsonData.data).to.have.property('size');
    });

    pm.test("分页数据格式正确", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.data.records).to.be.an('array');
        pm.expect(jsonData.data.total).to.be.a('number');
        pm.expect(jsonData.data.current).to.be.a('number');
        pm.expect(jsonData.data.size).to.be.a('number');
    });
}

// 成功响应验证函数
function validateSuccessResponse(response) {
    validateCommonResponse(response);
    
    pm.test("操作成功", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData.code).to.eql(200);
    });
}

// 错误响应验证函数
function validateErrorResponse(response, expectedCode) {
    pm.test("状态码正确", function () {
        pm.response.to.have.status(expectedCode || 400);
    });

    pm.test("响应包含错误信息", function () {
        var jsonData = pm.response.json();
        pm.expect(jsonData).to.have.property('code');
        pm.expect(jsonData).to.have.property('message');
        pm.expect(jsonData.code).to.not.eql(200);
    });
}

// 数据验证函数
function validateDataStructure(data, requiredFields) {
    requiredFields.forEach(function(field) {
        pm.test("数据包含" + field + "字段", function () {
            pm.expect(data).to.have.property(field);
        });
    });
}

// 保存响应数据到环境变量
function saveResponseData(response, dataPath, envVarName) {
    try {
        var jsonData = pm.response.json();
        var data = jsonData;
        
        if (dataPath) {
            dataPath.split('.').forEach(function(key) {
                data = data[key];
            });
        }
        
        if (data && data.id) {
            pm.environment.set(envVarName, data.id);
            console.log("已保存" + envVarName + ": " + data.id);
        }
    } catch (error) {
        console.log("保存数据失败: " + error.message);
    }
}

// 生成随机测试数据
function generateTestData() {
    var timestamp = Date.now();
    return {
        name: "测试数据_" + timestamp,
        description: "这是自动生成的测试数据_" + timestamp,
        phone: "138" + Math.floor(Math.random() * 100000000).toString().padStart(8, '0'),
        email: "test_" + timestamp + "@example.com"
    };
}

// 验证JWT Token
function validateJWTToken(token) {
    if (!token) {
        return false;
    }
    
    try {
        var parts = token.split('.');
        if (parts.length !== 3) {
            return false;
        }
        
        var payload = JSON.parse(atob(parts[1]));
        var currentTime = Math.floor(Date.now() / 1000);
        
        return payload.exp > currentTime;
    } catch (error) {
        return false;
    }
}

// 设置认证头
function setAuthHeader(token) {
    if (token) {
        pm.request.headers.add({
            key: 'Authorization',
            value: 'Bearer ' + token
        });
    }
}

// 清理测试数据
function cleanupTestData() {
    var testDataKeys = ['product_id', 'category_id', 'order_id', 'member_id', 'inventory_id'];
    testDataKeys.forEach(function(key) {
        pm.environment.unset(key);
    });
    console.log("已清理测试数据");
}

// 记录测试结果
function logTestResult(testName, success, message) {
    var result = {
        test: testName,
        success: success,
        message: message,
        timestamp: new Date().toISOString()
    };
    
    console.log("测试结果: " + JSON.stringify(result));
    
    // 可以在这里添加将结果发送到外部系统的逻辑
}

// 性能测试
function performanceTest(maxResponseTime) {
    pm.test("响应时间在可接受范围内", function () {
        pm.expect(pm.response.responseTime).to.be.below(maxResponseTime || 2000);
    });
}

// 数据一致性检查
function checkDataConsistency(originalData, updatedData, fieldsToCheck) {
    fieldsToCheck.forEach(function(field) {
        pm.test("数据一致性检查: " + field, function () {
            pm.expect(updatedData[field]).to.eql(originalData[field]);
        });
    });
}

// 导出函数供其他脚本使用
if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
        validateCommonResponse: validateCommonResponse,
        validatePageResponse: validatePageResponse,
        validateSuccessResponse: validateSuccessResponse,
        validateErrorResponse: validateErrorResponse,
        validateDataStructure: validateDataStructure,
        saveResponseData: saveResponseData,
        generateTestData: generateTestData,
        validateJWTToken: validateJWTToken,
        setAuthHeader: setAuthHeader,
        cleanupTestData: cleanupTestData,
        logTestResult: logTestResult,
        performanceTest: performanceTest,
        checkDataConsistency: checkDataConsistency
    };
}
